package com.rickpan.repository;

import com.rickpan.entity.DeveloperSession;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 开发者会话Repository
 * 
 * @author 开发团队协调员
 * @since 2025-07-17
 */
@Repository
public interface DeveloperSessionRepository extends JpaRepository<DeveloperSession, Long> {

    /**
     * 根据会话令牌查找会话
     * 
     * @param sessionToken 会话令牌
     * @return 会话信息
     */
    Optional<DeveloperSession> findBySessionToken(String sessionToken);

    /**
     * 查找用户的所有有效会话
     * 
     * @param userId 用户ID
     * @param now 当前时间
     * @return 有效会话列表
     */
    @Query("SELECT ds FROM DeveloperSession ds WHERE ds.userId = :userId AND ds.expiresAt > :now")
    List<DeveloperSession> findValidSessionsByUserId(@Param("userId") Long userId, @Param("now") LocalDateTime now);

    /**
     * 查找用户的所有会话
     * 
     * @param userId 用户ID
     * @return 会话列表
     */
    List<DeveloperSession> findByUserId(Long userId);

    /**
     * 删除用户的过期会话
     * 
     * @param userId 用户ID
     * @param expiresAt 过期时间
     * @return 删除的记录数
     */
    @Modifying
    @Query("DELETE FROM DeveloperSession ds WHERE ds.userId = :userId AND ds.expiresAt < :expiresAt")
    int deleteByUserIdAndExpiresAtBefore(@Param("userId") Long userId, @Param("expiresAt") LocalDateTime expiresAt);

    /**
     * 删除所有过期会话
     * 
     * @param now 当前时间
     * @return 删除的记录数
     */
    @Modifying
    @Query("DELETE FROM DeveloperSession ds WHERE ds.expiresAt < :now")
    int deleteExpiredSessions(@Param("now") LocalDateTime now);

    /**
     * 统计用户的有效会话数量
     * 
     * @param userId 用户ID
     * @param now 当前时间
     * @return 有效会话数量
     */
    @Query("SELECT COUNT(ds) FROM DeveloperSession ds WHERE ds.userId = :userId AND ds.expiresAt > :now")
    long countValidSessionsByUserId(@Param("userId") Long userId, @Param("now") LocalDateTime now);

    /**
     * 检查会话令牌是否存在且有效
     * 
     * @param sessionToken 会话令牌
     * @param now 当前时间
     * @return 是否存在且有效
     */
    @Query("SELECT COUNT(ds) > 0 FROM DeveloperSession ds WHERE ds.sessionToken = :sessionToken AND ds.expiresAt > :now")
    boolean existsValidSession(@Param("sessionToken") String sessionToken, @Param("now") LocalDateTime now);
}
